package com.linkgie.galaxyframework.crypto;

public interface CryptoRandom {
	
	void nextBytes(byte[] bytes, int offset, int length);
	
	default void nextBytes(byte[] bytes) {
		nextBytes(bytes, 0, bytes.length);
	}
	
	default byte[] nextBytes(int size) {
		byte[] bytes = new byte[size];
		nextBytes(bytes, 0, bytes.length);
		return bytes;
	}
	
	default int nextInt() {
		int value = 0;
		
		byte[] randBytes = new byte[4];
		nextBytes(randBytes, 0, 4);
		
		value = value | ((randBytes[0] & 0xFF) << 24);
		value = value | ((randBytes[1] & 0xFF) << 16);
		value = value | ((randBytes[2] & 0xFF) << 8);
		value = value | (randBytes[3] & 0xFF);
		
		return value;
	}
	
	default long nextLong() {
		long value = 0;
		
		byte[] randBytes = new byte[8];
		nextBytes(randBytes, 0, 8);
		
		value = value | ((randBytes[0] & 0xFF) << 56);
		value = value | ((randBytes[1] & 0xFF) << 48);
		value = value | ((randBytes[2] & 0xFF) << 40);
		value = value | ((randBytes[3] & 0xFF) << 32);
		value = value | ((randBytes[4] & 0xFF) << 24);
		value = value | ((randBytes[5] & 0xFF) << 16);
		value = value | ((randBytes[6] & 0xFF) << 8);
		value = value | (randBytes[7] & 0xFF);
		
		return value;
	}
	
	//TODO: convert as a SecureRandom;
//	SecureRandom asSecureRandom();
}
